package com.shlh.saas.service.linkedin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shlh.saas.entity.linkedin.LinkedInUser;
import com.shlh.saas.entity.linkedin.LinkedInUserEs;
import com.shlh.saas.model.dto.LinkedInQueryDTO;

import java.util.List;
import java.util.Map;

/**
 * LinkedIn用户服务接口
 */
public interface LinkedInUserService extends IService<LinkedInUser> {
    
    /**
     * 根据邮箱查询LinkedIn用户
     * @param email 邮箱
     * @return LinkedIn用户
     */
    List<LinkedInUser> findByEmail(String email);


    /**
     * 根据邮箱查询LinkedIn用户
     * @param phone 手机号
     * @return LinkedIn用户
     */
    List<LinkedInUser> findByPhone(String phone);
    
    /**
     * 根据公司名称查询LinkedIn用户列表
     * @param companyName 公司名称
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByCompanyName(String companyName);
    
    /**
     * 根据职位名称查询LinkedIn用户列表
     * @param jobTitle 职位名称
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByJobTitle(String jobTitle);
    
    /**
     * 分页查询LinkedIn联系人
     * 
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    Page<LinkedInUser> getLinkedInDataPage(LinkedInQueryDTO queryDTO);
    
    /**
     * 根据ID获取联系人详情
     * 
     * @param id 联系人ID
     * @return 联系人信息
     */
    LinkedInUser getLinkedInDataById(Integer id);
    
    /**
     * 导出LinkedIn联系人数据
     * 
     * @param queryDTO 查询参数
     * @return 导出的数据列表
     */
    List<LinkedInUser> exportLinkedInData(LinkedInQueryDTO queryDTO);
    
    /**
     * 在所有字段中搜索关键词
     * 
     * @param keyword 搜索关键词
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 符合条件的数据列表
     */
    List<LinkedInUser> searchByKeywordInAllFields(String keyword, int offset, int limit);
    
    /**
     * 带筛选条件的关键词搜索
     * 
     * @param keyword 搜索关键词
     * @param offset 偏移量
     * @param limit 限制数量
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param country 国家/地区筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @return 符合条件的数据列表
     */
    List<LinkedInUser> searchByKeywordWithFilters(String keyword, int offset, int limit, 
                                              String companyName, String jobTitle, String industry,
                                              String country, String contactMethod, String companySize, String companyFounded);
    
    /**
     * 统计所有字段中包含关键词的记录数量
     * 
     * @param keyword 搜索关键词
     * @return 记录总数
     */
    long countByKeywordInAllFields(String keyword);
    
    /**
     * 统计满足筛选条件和关键词的记录数量
     * 
     * @param keyword 搜索关键词
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param country 国家/地区筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @return 记录总数
     */
    long countByKeywordWithFilters(String keyword, String companyName, String jobTitle, String industry,
                               String country, String contactMethod, String companySize);
    
    /**
     * 获取搜索建议
     * 
     * @param keyword 关键词
     * @return 搜索建议列表
     */
    List<String> getSuggestions(String keyword);
    
    /**
     * 获取符合条件的LinkedIn数据数量
     *
     * @param queryDTO 查询参数
     * @return 符合条件的记录数
     */
    long countLinkedInData(LinkedInQueryDTO queryDTO);

    /**
     * 获取LinkedIn联系人指定字段的完整信息（未脱敏）
     *
     * @param contactId 联系人ID
     * @param fieldName 字段名称
     * @return 完整的字段信息
     */
    String getFullContactInfo(Long contactId, Long mt, String fieldName);

    // ==================== ES查询方法 ====================

    /**
     * ES分页查询LinkedIn用户列表
     *
     * @param queryDTO 查询参数
     * @return ES分页结果
     */
    Page<LinkedInUserEs> getLinkedInDataPageFromES(LinkedInQueryDTO queryDTO);

    /**
     * ES统计LinkedIn用户数量
     *
     * @param queryDTO 查询参数
     * @return 符合条件的记录数
     */
    long countLinkedInDataFromES(LinkedInQueryDTO queryDTO);

    /**
     * ES导出LinkedIn用户数据（两阶段查询）
     *
     * @param queryDTO 查询参数
     * @return 导出的数据列表
     */
    List<LinkedInUser> exportLinkedInDataFromES(LinkedInQueryDTO queryDTO);

    /**
     * ES关键词搜索（支持筛选条件）
     *
     * @param keyword 搜索关键词
     * @param offset 偏移量
     * @param limit 限制数量
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param location 位置筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @return ES查询结果
     */
    Page<LinkedInUserEs> searchByKeywordFromES(String keyword, int offset, int limit,
                                              String companyName, String jobTitle, String industry,
                                              String location, String contactMethod, String companySize);

    /**
     * ES关键词搜索计数（支持筛选条件）
     *
     * @param keyword 搜索关键词
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param location 位置筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @return 符合条件的记录数
     */
    long countByKeywordFromES(String keyword, String companyName, String jobTitle, String industry,
                             String location, String contactMethod, String companySize);

    /**
     * 获取LinkedIn用户筛选选项列表（从ES）
     *
     * @param queryDTO 查询条件
     * @return 筛选选项映射
     */
    Map<String, List<String>> getLinkedInFilterOptionsFromES(LinkedInQueryDTO queryDTO);

    // ==================== 两阶段查询方法 ====================

    /**
     * 两阶段查询：根据公司名称和职位查找LinkedIn用户
     *
     * @param companyName 公司名称
     * @param jobTitle 职位标题
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByCompanyAndJobFromES(String companyName, String jobTitle, int limit);

    /**
     * 两阶段查询：根据姓名和公司查找LinkedIn用户
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param companyName 公司名称
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByNameAndCompanyFromES(String firstName, String lastName, String companyName, int limit);

    /**
     * 两阶段查询：根据姓名和邮箱查找LinkedIn用户
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param email 邮箱
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByNameAndEmailFromES(String firstName, String lastName, String email, int limit);

    /**
     * 两阶段查询：根据手机号和姓名查找LinkedIn用户
     *
     * @param phoneNumber 手机号
     * @param firstName 名字
     * @param lastName 姓氏
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByPhoneAndNameFromES(String phoneNumber, String firstName, String lastName, int limit);

    /**
     * 两阶段查询：根据邮箱精确匹配查找LinkedIn用户
     *
     * @param email 邮箱
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByEmailFromES(String email, int limit);

    /**
     * 两阶段查询：根据LinkedIn URL查找用户
     *
     * @param linkedinUrl LinkedIn个人资料链接
     * @param limit 最大返回数量
     * @return LinkedIn用户列表
     */
    List<LinkedInUser> findByLinkedInUrlFromES(String linkedinUrl, int limit);

    List<LinkedInUser> searchLinkedInUsersWithEmail(String searchKeyword, int offset, int size);

    Long countLinkedInUsersWithEmail(String searchKeyword);

    List<LinkedInUser> searchLinkedInUsersWithPhone(String searchKeyword, int offset, int size);

    Long countLinkedInUsersWithPhone(String searchKeyword);

    List<Map<String, Object>> searchByEmail(String value, int size, int offset);

    List<Map<String, Object>> searchByPhone(String value, int size, int offset);

    Long countWithEmail(String value);

    Long countWithPhone(String value);

    List<Map<String, Object>> findByDomain(String domain, int size, int offset);

    long countByDomain(String domain);

    List<Map<String, Object>> searchLinkedInUsersByKeyword(String keyword, int offset, int size);

    List<Map<String, Object>> searchLinkedInByNameOrUrl(String keyword, int offset, int size);

    long countLinkedInUsersByKeyword(String keyword);
    
    /**
     * 根据领英链接和姓名查询LinkedIn数据
     * @param linkedinUrl 领英链接
     * @param name 姓名
     * @param offset 偏移量
     * @param size 限制数量
     * @return 符合条件的数据列表
     */
    List<Map<String, Object>> searchByLinkedInUrlAndName(String linkedinUrl, String name, int offset, int size);

    List<String> searchCompanies(String company);

    List<String> searchJobTitles(String jobTitles);

    List<String> searchIndustries(String industry);

    List<String> searchLocations(String location);

    List<LinkedInUser> searchLinkedInData(String companyName, String fullName, String website, Integer matchType);



}